package cn.com.greatwall.system.modules.system.repository;

import java.util.List;
import java.util.Set;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import cn.com.greatwall.system.modules.system.domain.Role;

/**
 * @Author herw
 * @Time 2020-06-27 9:13:50 PM
 * @Version 1.0
 * @Description:
 */
public interface RoleRepository extends JpaRepository<Role, Long>, JpaSpecificationExecutor<Role> {
    /**
     * 根据名称查询
     * 
     * @param name /
     * @return /
     */
    Role findByName(String name);

    /**
     * 删除多个角色
     * 
     * @param ids /
     */
    void deleteAllByIdIn(Set<Long> ids);

    /**
     * 根据用户ID查询
     * 
     * @param id 用户ID
     * @return /
     */
    @Query(value = "select r.* from sys_role r, sys_users_roles u where "
            + "r.role_id = u.role_id and u.user_id =?1", nativeQuery = true)
    Set<Role> findByUserId(Long id);

    /**
     * 根据用户ID查询
     * 
     * @param id 用户ID
     * @return /
     */
    @Modifying
    @Query(value = "delete from sys_roles_menus where menu_id =?1", nativeQuery = true)
    void untiedMenu(Long id);

    /**
     * 根据部门查询
     * 
     * @param deptIds /
     * @return /
     */
    @Query(value = "select count(1) from sys_role r, sys_roles_depts d where "
            + "r.role_id = d.role_id and d.dept_id in ?1", nativeQuery = true)
    int countByDepts(Set<Long> deptIds);

    /**
     * 根据菜单Id查询
     * 
     * @param menuIds /
     * @return /
     */
    @Query(value = "select r.* from sys_role r, sys_roles_menus m where "
            + "r.role_id = m.role_id and m.menu_id in ?1", nativeQuery = true)
    List<Role> findInMenuId(List<Long> menuIds);
}
